/*
 * void:
 *   表示没有任何类型的值。
 *   常用于表示函数没有返回值。
 *   只能赋值为 undefined 或 null（如果启用了 --strictNullChecks 选项，则只能赋值为 undefined）。
 */
// void
function log(message: string): void {
  console.log(message);
}

// void不能直接赋值
let a: void;
const b: number = a; // 报错

/*
 * never:
 *   表示那些永不存在的值的类型。
 *   常用于表示函数会抛出异常或永远不会有返回值。
 *   是任何类型的子类型，可以赋值给任何类型，但没有任何类型可以赋值给 never（除了 never 本身）
 */
// never
function throwError(message: string): never {
  throw new Error(message);
}

/*
 * any:
 *   表示任何类型。
 *   在类型检查时会被忽略，可以赋值给任何类型，也可以接受任何类型的值。
 *   通常用于兼容现有的 JavaScript 代码，但在严格类型检查中应尽量避免使用。
 */
// any
let value: any = 42;
value = 'Hello, World!';
value = true;
console.log(value);

/*
 * unknown:
 *   表示一个未知的类型。
 *   类似于 any，但更安全，因为你在使用 unknown 类型的值之前必须进行类型检查。
 *   可以赋值给任何类型，但不能直接使用，除非先进行类型断言或类型检查。
 */
// unknown
let unknownValue: unknown = 42;
unknownValue = 'Hello, World!';
unknownValue = true;

if (typeof unknownValue === 'string') {
  console.log(unknownValue.toUpperCase());
}

// void 用于表示无返回值的函数。
// never 用于表示永远不会返回的函数。
// any 用于兼容现有代码，但应尽量避免使用。
// unknown 用于表示未知类型，更安全，需要进行类型检查后才能使用。
